package cz.semjob.linguistic.reader.factory.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import cz.semjob.linguistic.reader.LinguisticFormatProcessingException;
import cz.semjob.linguistic.reader.attribute.ARelationshipAttribute;
import cz.semjob.linguistic.reader.attribute.value.linguistic.ParserAttributeValue;
import cz.semjob.linguistic.reader.factory.IParserFactory;

@Component
public class ParserFactory implements IParserFactory {
	
	@Autowired
	private ARelationshipAttribute relationshipAttribute;

//	public enum Relationship {
//		PREDICAT("Pred"), // Predikát, resp. uzel, který nezávisí na jiném uzlu;
//							// věší se na #.
//		SUBJECT("Sb"), // Subjekt (podmět).
//		OBJECT("Obj"), // Objekt (předmět).
//		ADVERBIALE("Adv"), // Adverbiale (příslovečné určení, bez dalšího
//							// rozlišení).
//		COMPLEMENT("Atv"), // Doplněk (jen tzv. určující), technicky zavěšen na
//							// neslovesném členu.
//		COMPLEMENT_VERBIAL("AtvV"), // Doplněk (jen tzv. určující), visící na
//									// slovese (chybí druhý řídící člen).
//		ATTRIBUTE("Atr"), // Atribut (přívlastek).
//		PREDICATE_NOMINAL("Pnom"), // Predikát nominální, resp. jmenná část
//									// přísudku se sponou být.
//		VERB_AUXILIARY("AuxV"), // Pomocné sloveso být (Auxiliary Verb).
//		COORDINATE("Coord"), // Koordinační uzel (souřadné spojení).
//		APPOSITION("Apos"), // Aposice (hlavní uzel).
//		TANTUM_REFLEXIVE("AuxT"), // Zvratné se, neoddělitelné se - reflexivní
//									// tantum.
//		PASIVUM_REFLEXIVE("AuxR"), // Zvratné se, které není Obj ani AuxT (tvoří
//									// pasivum reflexivní).
//		PREPOSITION("AuxP"), // Předložka primární, části předložky sekundární.
//		CONJUNCTION("AuxC"), // Spojka (podřadicí).
//		REDUNDANT_EMOTIVE("AuxO"), // Nadbytečný (odkazovací, emotivní) element.
//		VERB_EMPHATIZE("AuxZ"), // Zdůrazňovací slovo.
//		COMMA("AuxX"), // Čárka (ne však nositel koordinace).
//		GRAPHIC_SYMNBOL("AuxG"), // Jiné grafické symboly, které neukončují
//									// větu.
//		OTHER_ADVERB_PARTICLES("AuxY"), // Příslovce a částice, které nelze
//										// zařadit jinam.
//		TREE_ROOT("AuxS"), // Kořen stromu (#).
//		ENDING_INTERPUNCTION("AuxK"), // Koncová interpunkce věty.
//		EX_DEPENDENT("ExD"), // Náhradní funkce pro technické hrany vedoucí
//								// místo od elidovaného členu k "pseudořídícímu"
//								// slovu nebo pro hlavní člen věty bez predikátu
//								// (Ex-Dependent).
//		ATTRIBUTE_SUBSTANTIVE("AtrAtr"), // Řídícím slovem atributu může být
//											// díky strukturní víceznačnosti
//											// kterékoli z bezprostředně
//											// předcházejících (syntaktických)
//											// substantiv.
//		ATTRIBUTE_ADVERBUM("AtrAdv"), // Strukturní víceznačnost mezi závislostí
//										// adverbální (příslovečnou) a
//										// adnominální (zavěšení na jméno) bez
//										// sémantických důsledků.
//		ADVERBUM_ATTRIBUTE("AdvAtr"), // Dtto, s opačnou preferencí.
//		ATTRIBUTE_OBJECT("AtrObj"), // Strukturní víceznačnost mezi závislostí
//									// objektovou a adnominální (zavěšení na
//									// substantivum) bez sémantických důsledků.
//		OBJECT_ATTRIBUTE("ObjAtr"); // Dtto, s opačnou preferencí.
//
//		private String id;
//
//		Relationship(String id) {
//			this.id = id;
//		}
//
//		public String getId() {
//			return id;
//		}
//
//		public static Relationship fromId(String id) {
//			for (Relationship r : values()) {
//				if (r.id.equals(id))
//					return r;
//			}
//			return null;
//		}
//		
//		public static String[] getStringValues() {
//			String[] stringValues = new String[values().length];
//			for (int i=0; i< values().length; i++) {
//				stringValues[i] = values()[i].toString();
//			}
//			return stringValues;
//		}
//
//	}

	public ParserAttributeValue createAttribute(String column1, String column2)
			throws LinguisticFormatProcessingException {
		if (column1 == null || column2 == null) {
			throw new LinguisticFormatProcessingException(
					"Invalid input columns");
		}
		String relationship = relationshipAttribute.getValue(column2);
		if (relationship == null) {
			throw new LinguisticFormatProcessingException(
					"Invalid Dependency attribute: " + column2);
		}
		int headIndex = Integer.valueOf(column1);
		ParserAttributeValue parserAttr = new ParserAttributeValue();
		parserAttr.setDependencyRelationship(relationship, relationshipAttribute);
		parserAttr.setHeadIndex(headIndex);
		return parserAttr;
	}

	public ARelationshipAttribute getLanguageConfigRelationshipAttribute() {
		return relationshipAttribute;
	}

}
